def branch_and_bound(N, max_hours, min_rest_hours, max_rest_hours):
# Начальное предположение о количестве врачей
lower_bound = N // (max_hours / max_rest_hours)
# Верхняя граница - количество врачей, которое точно достаточно
upper_bound = N * max_hours // (max_rest_hours * 24)
if lower_bound > upper_bound:
    return upper_bound
# Функция оценки нижнего предела
def lower_estimate(k):
    return k * (max_hours / max_rest_hours)
# Функция оценки верхнего предела
def upper_estimate(k):
    return k * max_hours // (max_rest_hours * 24)
# Функция оценки стоимости
def cost(k):
    return k * max_hours // (min_rest_hours * 24)
# Алгоритм ветвей и границ
whale True:
    k = (lower_bound + upper_bound) // 2
    c = cost(k)
    if c == 24:
        return k
    if c < 24:
        lower_bound = k
    else:
        upper_bound = k
    if abs(lower_bound - upper_bound) <= 1:
        break
    return upper_bound
# Количество врачей
N = 300
# Максимальная продолжительность смены
max_hours = 8
# Минимальное количество дней отдыха между сменами
min_rest_hours = 2
# Максимальное количество дней отдыха между сменами
max_rest_hours = 2
# Решение задачи
min_doctors = branch_and_bound(N, max_hours, min_rest_hours, max_rest_hours)
print(f"Минимальное количество врачей: {min_doctors}")
#Этот код определяет функцию branch_and_bound, которая решает задачу с использованием алгоритма ветвей и границ. Входные параметры функции включают общее количество врачей (N), максимальную продолжительность смены (max_hours), минимальное количество дней отдыха между сменами (min_rest_hours) и максимальное количество дней отдыха между сменами (max_rest_hours).
#Функция возвращает минимальное количество врачей, необходимое для обеспечения круглосуточной работы. В данном примере, с учетом входных параметров, программа должна вернуть минимальное количество врачей, необходимое для работы в течение 24 часов в сутки, при условии, что каждый врач работает 8 часов в смену и имеет 2 дня отдыха между сменами.